// 引入axios
import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router/index'

// 定义请求根路径与超时时限
const baseURL = '/api'
const timeout = 5000

const request = axios.create({
  baseURL,
  timeout
})

// 请求拦截器
request.interceptors.request.use(config => {
  // 在发送请求之前做些什么
  // 为请求头添加 Authorization 字段，填写服务器返回的登陆令牌token
  config.headers.Authorization = sessionStorage.getItem('authorization')
  return config
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error)
})

let errorCount = 0
const httpCode = {
  400: '请求参数错误',
  401: '登陆权限已过期, 请重新登录',
  403: '服务器拒绝本次访问',
  404: '请求资源未找到',
  500: '内部服务器错误',
  501: '服务器不支持该请求中使用的方法',
  502: '网关错误',
  504: '网关超时'
}

// 响应拦截器
request.interceptors.response.use(response => {
  // 对响应数据做点什么
  if (response.data.code === 200 || response.data.code === 500) {
    // 后端正常返回，错误次数设置为0
    errorCount = 0
    // 返回接口数据
    return Promise.resolve(response.data)
  }
  if (response.data.code) {
    // 判断错误次数是否小于1
    if (errorCount < 1) {
      // 弹出错误提示
      ElMessage({
        message: response.data.message ? response.data.message : response.data.msg,
        type: 'error'
      })
    }
    // 错误次数加1
    errorCount++
    if (response.data.code === 401 || response.data.code === '401') {
      // 删除登录令牌
      sessionStorage.removeItem('authorization')
      // 跳转到登录页
      router.push('/login')
    }
    return
  }
  return Promise.resolve(response.data)
}, error => {
  if (error.response) {
    // 获取请求异常对应的说明
    const tips = error.response.status in httpCode ? httpCode[error.response.status] : error.response.data.message
    // 当错误请求次数小于1
    if (errorCount < 1) {
      // 提示消息
      ElMessage({
        message: tips,
        type: 'error'
      })
    }
    errorCount++
    if (error.response.status === 401) {
      // 删除登录令牌
      sessionStorage.removeItem('authorization')
      // 跳转到登录页
      router.push('/login')
    }
    return Promise.reject(error)
  } else {
    ElMessage({
      message: '请求超时',
      type: 'error'
    })
  }
})

export default request